WebSocketに対応したCloudFrontをwscatで疎通確認してみた
はじめに
AWSチームのすずきです。
AWSのCDN、Amazon CloudFront が WebSocketに対応するアップデートがありました。
Amazon CloudFront announces support for the WebSocket protocol
CloudFront経由したWebSocket通信が可能な事をwscatを用いて確認する機会がありましたので紹介させて頂きます。
wscat
WebSocket のサーバ/クライアントとしてNode.jsで実装された「wscat」を利用しました。
環境
構成図
EC2
- OSはAmazonLinux2の最新AMI、東京とオレゴンの各リージョンに起動しました。
- オレゴンのEC2をWebSocketサーバ、東京のEC2をWebSocketクライアントとして利用しました。
- オレゴンのEC2、WebSocketはTCP8000でListen、ELB(ALB)からの疎通許可を与えたセキュリティグループ設定を行いました。
ELB
- WebSocketに対応するALB(Application Load Balancer)を利用しました。
- HTTP(TCP80)、HTTPS(TCP443)を全インターネットに公開するセキュリティグループを付与しました。
- HTTPSリスナー設定は、ACMで作成済みだった独自ドメイン用のワイルドカード証明書を利用しました。
- ヘルスチェックの成功コード設定、「wscat」が戻すHTTPレスポンスコード「426」を正常とする設定としました
wscatのヘルスチェック応答
$ curl -v http://##.##.##.##:8000 * Rebuilt URL to: http://##.##.##.##:8000/ * Trying ##.##.##.##... * TCP_NODELAY set * Connected to ##.##.##.## (##.##.##.##) port 8000 (#0) > GET / HTTP/1.1 > Host: ##.##.##.##:8000 > User-Agent: curl/7.55.1 > Accept: */* > < HTTP/1.1 426 Upgrade Required < Content-Length: 16 < Content-Type: text/plain < Date: Fri, 23 Nov 2018 04:20:55 GMT < Connection: keep-alive
Route53
- ELBのDNS名(###-####.us-west-2.elb.amazonaws.com)をターゲットとするエイリアスレコードを作成。 - HTTPS通信に必要な独自ドメインによる名前解決を可能に設定しました。
CloudFront
- Route53で設定したDNSレコードをオリジンとする、カスタムドメイン設定、HTTP/HTTPS用のDistributionsを作成しました。
- CloudFrontからオリジン(ELB)の通信は「HTTPS」としました。
- CloudFrontのHTTPS設定はデフォルトのDNS名、「###.cloudfront.net」を利用する設定としました。
wscat設定
インストール
サーバ、クライアントとなる2台のAmazon Linux 2の環境に、以下のコマンドでインストールを実施しました。
curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash - sudo yum -y install nodejs sudo npm install -g wscat
サーバ
オレゴンのEC2環境でWebSocketサーバを起動しました。
wscat -l 8000
クライアント
WebSocketクライアントのEC2(東京)から、WebSocketサービスを公開したオレゴンのELB(ALB)、CloudFront宛の通信を試みました。
ELB
- HTTP
wscat -c ws://####.us-west-2.elb.amazonaws.com:80 wscat -c ws://<ELBの独自ドメインFQDN>:80
- HTTPS
wscat -c wss://<ELBの独自ドメインFQDN>:443
CloudFront
- HTTP
wscat -c ws://<CloudFrontホスト名>.cloudfront.net:80
- HTTPS
wscat -c wss://<CloudFrontホスト名>.cloudfront.net:443
結果
CloudFront、ELB(ALB)を経由した、HTTP、HTTPSによるWebSocket通信が可能な事を確認できました。
クライアント出力
$ wscat -c wss://#######.cloudfront.net:443 connected (press CTRL+C to quit) > cloudfront ?
サーバ出力
$ wscat -l 8000 --no-color listening on port 8000 (press CTRL+C to quit) client connected < cloudfront ?
まとめ
CloudFrontを経由したWebSocket、HTTP(TCP:80)だけでなく、HTTPS(TCP:443)を利用したセキュアな利用が可能な事を確認出来ました。
CloudFrontの接続ポイントは、2018年11月現在 26 か国 59 都市にある 132 個、 国内では、東京8拠点、大阪で1拠点が提供されており、クライアントに近い接続ポイントの利用とAWSのバックボーンによるネットワークの最適化が期待できます。
また、CloudFrontとオリジンのEC2(ELB)間の転送課金は免除、 トラフィックコミット (通常 10 TB/月以上)により、EC2(ELB)よるプライベート料金でCloudFront利用する事で、 AWSからのアウトバウンド通信に応じて発生するAWS費用を抑制できる可能性もあります。
AWS上でWebSocketを利用するシステムの最適化手段の一つとして、CloudFrontのアップデートをお試しください。